// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database() // 获取数据库
const rp = require('request-promise') // 引入request-promise
const URL = 'http://musicapi.xiecheng.live/personalized' // 数据接口的URL
const playlistCollection = db.collection('playlist_') // 数据库获取playlist操作
//定义读取数据的最大条数（云函数最大100，微信小程序最大20条）
const MAX_LIMIT = 100
// 云函数入口函数
exports.main = async(event, context) => {
  let result = await playlistCollection.count()
  //获取playlist的数据数量
  let total = result.total

  // 实际的数据数量 / 最大函数 等于 需要循环几次取完所有的数据 Math.ceil()是对算出来的值进行向上取整
  let batchTimes = Math.ceil(total / MAX_LIMIT)
  let tasks = []
  for (let i = 0; i < batchTimes; i++) {
    let promise = playlistCollection.skip(i * MAX_LIMIT).limit(MAX_LIMIT).get()
    tasks.push(promise)
  }
  let list = {
    data: []
  }
  // 当tasks里有promise函数执行时则运行此段函数 没有数据时则不运行
  if (tasks.length > 0) {
    list = (await Promise.all(tasks)).reduce((acc, cur) => { // reduce方法是迭代增加
      return {
        data: acc.data.concat(cur.data)
      }
    })
  }
  // 通过request-promise的请求去获取歌单数据
  let playlist = await rp(URL).then((res) => {
    return JSON.parse(res).result
  })
  // 数据去重处理 如果新增的数据与数据库中现有的数据是相同的 则不会添加至数据库playlist中
  // 定义一个存放数据库中不存在 将会新增入数据库中数据的数组
  let newData = []
  let newList = playlist
  // for (let i = 0; i < newList.length; i++) {
  //   // let flag = true // 定义一个标识 来判断需要新增的数据是否是数据库中已经存在的
  //   for (let y = 0; y < list.data.length; y++) {
  //     if (newList[i].id === list.data[y].id) {
  //       // 如果新增的数据是数据库中已经存在的 则改变标识符 由于这一条已经确认完毕 则阻止继续循环 提高效率
  //       newList.splice(i, 1)
  //       i = i - 1
  //     }
  //     // if (flag) {
  //     //   newData.push(playlist[i]) // flag为true时 代表新增的数据不存在于数据库中 则push到存放新数据的数组中
  //     // }
  //   }
  // }
  for (let i = 0; i < list.data.length; i++) {
    for (let y = 0; y < newList.length; y++) {
      if (list.data[i].id === newList[y].id) {
        newList.splice(y, 1)
        y = y - 1
        break
      }
    }
  }
  newData = newList
  for (let i = 0; i < newData.length; i++) {
    // 循环去重后的需要新增的数据并添加至数据库中
    await playlistCollection.add({
      data: {
        ...newData[i],
        createTime: db.serverDate(), // 数据库的时间
      }
    }).then((res) => {
      console.log('插入成功')
    }).catch((err) => {
      console.log('插入失败')
    })
  }
  return newData.length
}